目標系統通過功能與整體測試後,還要放入可以長期運作的執行環境。部署方案會限制可採用的作業系統、封裝方式、相依項目及更新流程,也會影響故障後能否在允許時間內恢復。
選擇工具前,應該先確認部署位置、管理責任、停機限制與復原要求,再決定部署單位及工具組合。工具可以協助建立與執行方案,無法代替這些條件判斷。
部署環境會在程式完成前影響技術選擇。目標系統使用的語言、框架與相依項目如果無法在指定環境中安裝、啟動或維護,即使功能測試已經通過,也不能形成可用的部署方案。
開始設計前,應該將環境限制記錄成可確認的條件:
| 確認面向 | 要回答的問題 | 應留下的結果 |
|---|---|---|
| 執行位置 | 目標系統要由哪一方提供及管理執行環境?是否能建立測試、預備與正式環境? | 各環境的用途、管理責任及建立方式 |
| 作業系統與執行方式 | 可以使用哪些作業系統、執行階段與系統功能?版本支援期限為何? | 支援版本、安裝條件及更新限制 |
| 輸入輸出與連線 | 系統需要使用哪些輸入輸出?如果包含網路互動,可以使用哪些通訊方式與連線範圍? | 必要連線、連接埠、名稱解析及限制 |
| 執行資源 | 日常與尖峰情境需要多少處理、保存及傳輸能力?資源不足時如何處理? | 初始配置、容量上限及調整方式 |
| 存取限制 | 哪些人員或自動流程可以建立、變更、啟動、停止及查閱部署結果? | 角色、允許動作、核准方式及稽核要求 |
| 資料與規範 | 哪些資料可以進入該環境?是否有保存位置、加密、期限或稽核限制? | 適用規則、禁止事項及確認責任者 |
| 維護能力 | 誰負責更新執行環境、處理故障與演練復原?可取得哪些支援? | 維運責任、支援來源及處理時段 |
表格中的項目要按照實際系統刪減或補充。如果系統沒有網路互動,就不需要為它設計連線架構。如果系統不要求持續運作,也不必直接加入叢集(Cluster)或自動擴充機制。
「容易部署」或「具備高可用性」無法直接驗收。部署需求應該包含可觀察的情境、限制值與通過條件,讓候選方案可以使用相同基準比較。
| 需求面向 | 需要定義的內容 | 可檢查結果範例 |
|---|---|---|
| 停機限制 | 每次發布及非預期故障可以中斷多久?哪些時段可以執行變更? | 發布操作在核准時段內完成,中斷時間沒有超過限制 |
| 發布頻率 | 預計多久發布一次?緊急修正需要多快完成? | 從核准版本到完成部署的時間符合目標 |
| 可用性 | 如果系統需要持續運作,允許多少中斷?哪些功能必須優先恢復? | 指定故障情境下仍可提供必要功能,或能在限制時間內恢復 |
| 擴充方式 | 哪些處理量變化已經確認?需要調整單一執行單位,還是增加相同單位? | 在指定處理量下符合回應時間與錯誤比例 |
| 備份與資料復原 | 要保存哪些資料與設定?可以接受遺失多少變更? | 備份可以在演練環境復原,復原後通過資料及功能檢查 |
| 災難復原 | 哪些環境失效情境需要處理?復原時間目標(Recovery Time Objective, RTO)與復原點目標(Recovery Point Objective, RPO)為何? | 演練結果符合核准的 RTO 與 RPO |
| 部署失敗處理 | 失敗時要停止、還原(Rollback)既有版本,還是完成向前修正(Roll Forward)? | 每種失敗情境都有觸發條件、操作步驟與驗證結果 |
資料備份與版本還原處理不同問題。備份用來復原保存資料或設定,版本還原則把程式及相關設定切回已知可用狀態。兩者都要實際演練,不能因為已保留檔案或版本名稱就視為可以復原。
部署單位是可以獨立建置、版本化、啟動、停止及更換的程式集合。它不一定等同於程式碼中的模組,也不代表每個功能都要獨立部署。
| 部署單位 | 特性 | 適合評估的情況 | 主要代價 |
|---|---|---|---|
| 單一應用程式 | 所有功能隨同一版本一起建置及部署 | 功能規模可由同一執行流程承擔,而且共同更新不會造成無法接受的影響 | 任一變更都需要重新驗證及部署整體程式 |
| 模組化單體(Modular Monolith) | 程式內部具有明確模組邊界,正式執行時仍是單一部署單位 | 希望保留模組責任,同時維持較簡單的部署與維運方式 | 模組仍共用發布時程與執行失敗範圍 |
| 多個服務 | 各服務可以獨立建置、部署及調整執行數量 | 已確認需要獨立發布、故障隔離或不同擴充方式 | 需要處理跨服務互動、版本相容、可觀測性及故障情境 |
| 背景工作 | 不依賴持續互動,可以按照事件、排程或人工指令執行 | 系統包含匯入、轉換、彙整或其他可獨立執行工作 | 需要定義重複執行、失敗重試、中止及執行結果保存方式 |
如果多個程式必須永遠一起發布、共同停止,而且無法獨立驗收,把它們拆成多個部署單位通常只會增加協調工作。相反地,已確認具有不同更新頻率、擴充需求或失敗範圍的項目,才適合評估獨立部署。分散式架構的判斷與互動設計會由後續章節繼續說明。
部署方案可能同時使用多種工具。虛擬化平臺建立隔離的執行環境,容器引擎負責建立及執行容器,容器編排工具維持多個容器化工作負載的預期狀態,自動化流程工具執行檢查與部署步驟,基礎設施即程式碼則描述並管理環境資源。
| 工具層次 | 主要管理對象 | 不會自動解決的問題 |
|---|---|---|
| 虛擬化平臺 | 虛擬機(Virtual Machine, VM)及其隔離環境 | 不會自動定義應用程式的建置、測試與發布規則 |
| 容器引擎 | 容器映像檔、容器、儲存空間及連線設定 | 不會自動提供跨多個執行位置的調度與高可用性 |
| 多容器定義工具 | 同一應用程式所需的多個容器與相依關係 | 不會因為使用多個容器就形成完整叢集管理能力 |
| 容器編排平臺 | 容器化工作負載的部署、調度、擴充及故障替換 | 不會建置原始碼,也不會自行決定持續整合與發布流程 |
| 持續整合與持續部署工具 | 由事件觸發的檢查、建置、核准與部署工作 | 不會替目標系統決定部署架構與驗收條件 |
| 基礎設施即程式碼工具 | 可由程式描述並管理的環境資源及其生命週期 | 不會保證每項變更都安全,也不會取代審查、備份與復原演練 |
先確認缺少的是哪一層能力,再加入相應工具。工具之間可以組合,但每多一層就會增加版本相容、更新、監控、存取限制與故障處理責任。
虛擬機適合需要完整作業系統隔離、既有執行方式難以容器化,或正式環境已經採用虛擬化管理流程的情境。選擇時要比較現有環境相容性、集中管理、備份、遷移、自動化介面、授權與支援方式。
| 工具 | 主要定位 | 適合評估的情況 | 導入前要確認的事項 |
|---|---|---|---|
| VMware vSphere 與 vCenter | vSphere 提供虛擬化平臺,vCenter 集中管理虛擬化資源、生命週期與可用性功能 | 正式環境已使用 VMware 技術,或需要集中管理多個虛擬化資源 | 版本相容、授權方案、支援期限、備份與復原、自動化介面及現有管理能力 |
| Microsoft Hyper-V | 在 Windows 執行環境建立及管理 Windows 或 Linux 虛擬機,並可與其他 Windows 管理功能整合 | 已有 Windows 虛擬化管理能力,且目標系統符合其支援條件 | 作業系統版本、來賓系統支援、集中管理方式、可用性設計、備份及復原程序 |
| Proxmox Virtual Environment | 整合 KVM 虛擬機、Linux 容器、網頁管理、叢集與災難復原功能 | 希望評估開放原始碼虛擬化平臺,並由維運人員管理完整環境生命週期 | KVM 與 LXC 的適用界線、更新方式、支援來源、叢集需求、備份及復原能力 |
vCenter 是 vSphere 環境的集中管理元件,不能單獨視為所有虛擬機方案的共同工具。候選方案如果依賴特定管理平臺,概念驗證也要包含該平臺的建立、更新與復原流程。
容器(Container)將程式、必要相依項目及預設執行資訊封裝成可重複使用的映像檔。它可以減少環境差異,但仍要處理映像來源、更新、保存資料、連線、執行限制及敏感設定。
| 工具 | 工具層次與主要能力 | 適合評估的情況 | 導入前要確認的事項 |
|---|---|---|---|
| Docker Engine | 容器引擎,透過常駐程序、API 與命令列管理映像檔、容器、儲存空間及連線 | 需要成熟的容器工作流程與廣泛工具整合 | 支援平臺、常駐程序管理、無特權模式、映像來源、授權及更新方式 |
| Podman | 無常駐程序的容器引擎,可管理 Pod、容器與映像檔,並支援非特權執行 | 希望減少常駐管理程序,或需要配合 Linux 既有程序管理方式 | 正式環境支援、非特權執行限制、命令相容差異、遠端管理及周邊工具整合 |
| Docker Compose | 使用 Compose 檔案定義並啟動多容器應用程式 | 部署單位包含少量固定容器,而且可以由單一已知執行環境管理 | 正式環境支援方式、啟動順序、健康檢查、失敗重啟、保存資料及更新程序 |
| Kubernetes | 以宣告式設定管理容器化工作負載及服務,提供調度、擴充、故障替換與發布控制 | 已確認需要在叢集內調度工作負載、獨立擴充或自動維持預期狀態 | 叢集管理責任、版本升級、連線與保存方式、可觀測性、存取限制及故障處理能力 |
Docker Compose 與 Kubernetes 的管理範圍不同。Compose 適合描述多容器應用程式,Kubernetes 則持續調整工作負載,使實際狀態接近宣告狀態。容器數量少或不需要叢集能力時,Kubernetes 增加的控制元件與維運工作未必能帶來相應價值。
持續整合與持續部署(Continuous Integration and Continuous Deployment, CI/CD)工具可以把檢查、建置、測試與部署步驟寫成可重複執行的流程。本章只比較工具與部署環境的適配性,流程觸發、成品管理、核准與自動部署會由後續章節說明。
| 工具 | 主要定位 | 適合評估的情況 | 導入前要確認的事項 |
|---|---|---|---|
| GitHub Actions | 以儲存庫事件觸發工作流程,透過執行器(Runner)執行檢查、建置及部署工作 | 原始碼與協作流程已在 GitHub,並希望整合環境保護及部署紀錄 | 執行器位置、正式環境連線、環境核准、敏感設定、同時執行限制、費用及紀錄保存 |
| GitLab CI/CD | 以 .gitlab-ci.yml 定義工作、階段與管線,並由 Runner 執行 |
原始碼與協作流程已在 GitLab,或需要配合 GitLab 的整合式管線管理 | GitLab 提供方式、Runner 維護、正式環境連線、保護規則、敏感設定、費用及紀錄保存 |
GitHub 與 GitLab 是協作平臺,表格比較的是其中的 GitHub Actions 與 GitLab CI/CD。無論採用哪一項工具,執行器都要能在符合存取限制的前提下到達部署環境。把正式環境的廣泛存取能力長期放在一般建置流程中,會擴大流程遭誤用或受影響時的範圍。
基礎設施即程式碼(Infrastructure as Code, IaC)以可版本化的程式或設定描述環境資源。它能讓建立與變更流程重複執行,也能在套用前顯示預計異動。採用 IaC 時,仍要管理狀態、敏感資訊、變更核准及工具本身的版本。
| 工具 | 主要定位 | 適合評估的情況 | 導入前要確認的事項 |
|---|---|---|---|
| Terraform | 使用 HashiCorp Configuration Language 描述資源,透過 Provider 建立計畫並管理生命週期與狀態 | 需要廣泛 Provider 生態系,並接受其設定語言與狀態管理方式 | Provider 支援、版本與授權、狀態保存與鎖定、資源匯入、敏感資訊及失敗復原 |
| OpenTofu | 採用寫入、規劃與套用流程管理可重現的基礎設施,並延續相近的設定及 Provider 模型 | 希望評估由 Linux Foundation 管理的開放原始碼 IaC 選項 | 既有設定相容性、Provider 支援、版本升級、狀態保存與鎖定、維護來源及遷移程序 |
| Pulumi | 使用 TypeScript、Python、Go、.NET、Java 或 YAML 描述資源,由部署引擎計算變更 | 希望使用熟悉的程式語言、型別與測試工具建立可重用環境元件 | 語言與套件版本、狀態保存位置、Provider 支援、預覽與核准、敏感資訊及部署引擎維護方式 |
比較 IaC 工具時,不能只確認是否能建立第一個環境。還要以現有資源匯入、設定漂移、部分套用失敗、Provider 升級、狀態遺失及資源刪除等情境驗證生命週期。計畫畫面也需要人工或自動規則檢查,避免未預期的替換與刪除直接進入正式環境。
工具選擇應該能說明「哪一項限制導致哪一個決定」。下列情境只用來示範推導方式,不能直接當成所有系統的標準答案:
程式語言、框架與資料保存方式也要回到部署限制重新檢查。候選技術必須能在指定作業系統與執行方式中受到支援,具備可接受的建置與啟動時間,並且能讓維運人員完成更新、觀察、備份及故障處理。如果系統包含資料庫、訊息系統或其他保存型相依項目,還要分別確認其部署、升級、一致性與復原方式。
文件中的功能清單只能協助縮小候選範圍。高風險差異應該使用概念驗證(Proof of Concept, POC)取得實際結果。POC 可以選擇一個最小但完整的部署單位,完成下列工作:
POC 要使用正式方案會採用的關鍵元件與限制,但不需要先建置完整正式環境。驗證結果不符合門檻時,應該修改方案或選擇其他候選工具,不能只把失敗步驟留給正式部署時處理。
完成比較與 POC 後,使用架構決策紀錄(Architecture Decision Record, ADR)保存選擇,讓後續人員知道這項決定適用的條件及重新評估時機。
| ADR 欄位 | 應記錄的內容 |
|---|---|
| 決策問題 | 要決定的部署單位、環境或工具層次 |
| 已確認限制 | 作業系統、停機、容量、資料、存取、規範與維運條件 |
| 候選方案 | 每個方案的組成、必要前提及不採用選項 |
| 比較結果 | 需求符合程度、POC 結果、成本、風險與維護責任 |
| 最後選擇 | 採用方案及它解決的具體問題 |
| 已知代價 | 新增的相依、管理工作、限制與待處理風險 |
| 重新評估條件 | 處理量、發布頻率、支援週期、故障情況或需求改變達到何種條件時重開決策 |
ADR 應該連回部署需求與 POC 結果。只寫「採用 Kubernetes」或「使用 Docker」無法說明工具為何適合,也無法在條件改變時判斷是否需要調整。
進入實際部署流程前,可以使用下列問題確認方案: